<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="content-type" content="text/html; charset=utf-8">
  <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport">
  <meta name="baidu-site-verification" content="code-UjJKh3jtOo">
  <link rel="stylesheet" href="//unpkg.com/@highlightjs/cdn-assets@11.5.0/styles/atom-one-dark.min.css">
  <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">
  <title>Tit1e</title>
  <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2767111597631391" crossorigin="anonymous"></script>
  
<link rel="stylesheet" href="/css/style.css">

<meta name="generator" content="Hexo 6.3.0"><link rel="alternate" href="/atom.xml" title="Tit1e" type="application/atom+xml">
</head>

<body class="dark">
    <div class="container">
    <header class="header">
  <div class="title">
      <a href="/" class="logo">Tit1e</a>
      <div class="btn-dark"></div>
      <script>
        let bodyClx = document.body.classList;
        let btnDark = document.querySelector('.btn-dark');
        let sysDark = window.matchMedia('(prefers-color-scheme: dark)');
        let darkVal = localStorage.getItem('dark');

        let setDark = (isDark) => {
        bodyClx[isDark ? 'add' : 'remove']('dark');
        localStorage.setItem('dark', isDark ? 'yes' : 'no');
        };

        setDark(darkVal ? darkVal === 'yes' : sysDark.matches);
        requestAnimationFrame(() => bodyClx.remove('not-ready'));

        btnDark.addEventListener('click', () => setDark(!bodyClx.contains('dark')));
        sysDark.addEventListener('change', (event) => setDark(event.matches));
      </script>
  </div>
    <ul class="menu">
        
        
        
        
        <li class="menu-item ">
            <a href="/" class="menu-item-link">Home</a>
        </li>
        
        
        <li class="menu-item ">
            <a href="/archives/" class="menu-item-link">Archives</a>
        </li>
        
        
        <li class="menu-item ">
            <a href="/atom.xml" class="menu-item-link">RSS</a>
        </li>
        
        
        <li class="menu-item ">
            <a target="_blank" rel="noopener" href="https://pixeltimer.art" class="menu-item-link">Pixel Timer</a>
        </li>
        
    </ul>
    <div class="search-box">
        <input type="search" id="search" placeholder="搜索">
    </div>
</header>
    <article class="post">
  <div class="post-meta">
    <span class="post-time">12 / 24, 2020</span>
  </div>
  <div class="post-title">
    <h1 class="title">pm2 基础使用指南</h1>
  </div>
  
  <ul class="post-tags">
    
    <li class="tag-item">
      #折腾
    </li>
    
    <li class="tag-item">
      #学习
    </li>
    
  </ul>
  
  <div class="post-content">
    <p><a target="_blank" rel="noopener" href="https://github.com/Unitech/pm2">pm2</a> 我想用 Node.js 在服务器上搭过服务的应该都知道。因为正常情况跑 node 服务需要在终端执行 <code>node inde.js</code> 命令，而服务器我们一般是使用终端通过 SSH 远程连接，我们不可能一直保持与服务器的连接，也不可能一直开着运行服务的终端窗口，所以我们需要一个工具来帮忙挂着这个服务，pm2 就是这么个工具。</p>
<h2 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h2><pre><code class="bash">sudo npm install pm2 -g
</code></pre>
<h2 id="基础用法"><a href="#基础用法" class="headerlink" title="基础用法"></a>基础用法</h2><h4 id="启动某个服务"><a href="#启动某个服务" class="headerlink" title="启动某个服务"></a>启动某个服务</h4><pre><code class="bash"># --watch 表示：服务文件发生变化时，pm2会自动帮你重启服务
pm2 start app.js --watch
以 xxx 为命名启动进程
pm2 start app.js --watch --name xxx
</code></pre>
<h4 id="查看启动中的服务"><a href="#查看启动中的服务" class="headerlink" title="查看启动中的服务"></a>查看启动中的服务</h4><pre><code class="bash">pm2 list
</code></pre>
<p><img src="https://personal-1251959693.cos.ap-chengdu.myqcloud.com/2020-12-24-063206.png"></p>
<h4 id="停止某个或全部服务"><a href="#停止某个或全部服务" class="headerlink" title="停止某个或全部服务"></a>停止某个或全部服务</h4><pre><code class="sh">pm2 stop name || id || &#39;all&#39;

# 比如我要停止上图中名为 JinYa 的这个服务
pm2 stop JinYa
# 或者
pm2 stop 2
# 如果停止全部
pm2 stop all
</code></pre>
<h4 id="重启某个或全部服务"><a href="#重启某个或全部服务" class="headerlink" title="重启某个或全部服务"></a>重启某个或全部服务</h4><pre><code class="sh">pm2 restart name || id || &#39;all&#39;

# 比如我要重启上图中名为 JinYa 的这个服务
pm2 restart JinYa
# 或者
pm2 restart 2
# 如果停止全部
pm2 restart all
</code></pre>
<h4 id="删除某个或全部服务"><a href="#删除某个或全部服务" class="headerlink" title="删除某个或全部服务"></a>删除某个或全部服务</h4><pre><code class="sh">pm2 delete name || id || &#39;all&#39;

# 比如我要重启上图中名为 JinYa 的这个服务
pm2 delete JinYa
# 或者
pm2 delete 2
# 如果停止全部
pm2 delete all
</code></pre>
<h4 id="查看某个服务的描述"><a href="#查看某个服务的描述" class="headerlink" title="查看某个服务的描述"></a>查看某个服务的描述</h4><pre><code class="sh">pm2 describe name || id
</code></pre>
<p>如果服务器上有十几甚至几十个服务，那么一个一个启动就显得十分繁琐，所以 pm2 也可以通过配置文件启动。</p>
<h4 id="通过配置文件批量启动"><a href="#通过配置文件批量启动" class="headerlink" title="通过配置文件批量启动"></a>通过配置文件批量启动</h4><pre><code class="json">// 创建一个名为 server.json 的文件
&#123;
  &quot;apps&quot;: [
    &#123;
      &quot;name&quot;: &quot;server1&quot;, // 服务名称
      &quot;script&quot;: &quot;./xxx/index.js&quot;, // 服务入口文件路径
      &quot;watch&quot;: true // 监听服务，服务发生变化时自动重启
    &#125;,
   &#123;
      &quot;name&quot;: &quot;server2&quot;,
      &quot;script&quot;: &quot;./xxx/app.js&quot;,
      &quot;watch&quot;: true
    &#125;,
  ]
&#125;
</code></pre>
<pre><code class="bash">pm2 start server.json
</code></pre>
<p>上面 <code>stop</code>、<code>restar</code>、<code>delete</code> 命令其实都可通过 json 文件来批量执行。</p>
<h4 id="查看进程资源消耗情况"><a href="#查看进程资源消耗情况" class="headerlink" title="查看进程资源消耗情况"></a>查看进程资源消耗情况</h4><pre><code class="bash">pm2 monit
</code></pre>
<p>上面这些命令只是一些我在日常使用中经常用到的基础命令，pm2 这个工具所能做的远远不止这些。它还可以做负载均衡，内存监控等其他很多事情，只是我的应用场景没用那么复杂，所以并没有深入了解这些功能。</p>

  </div>
  <div class="post-near">
    
    <a
      class="post-near-prev"
      href="/p/21094eb7.html"
      title="Node.js 爬虫初步实践"
    >
      <span class="arrow">←</span>
      <span class="post-near-title">
        Node.js 爬虫初步实践
      </span>
    </a>
    
    
    <a
      class="post-near-next"
      href="/p/693b2eb0.html"
      title="用快捷指令快速打开支付码、扫一扫或支付宝指定小程序"
    >
      <span class="post-near-title">
        用快捷指令快速打开支付码、扫一扫或支付宝指定小程序
      </span>
      <span class="arrow">→</span>
    </a>
    
  </div>
</article>

    <footer class="footer">
  <p>本博客采用 <a class="license-link" rel="license noopener" target="_blank" href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh">署名-非商业性使用-相同方式共享 4.0 国际</a>协议进行许可</p>
  <p>
    <span>Thanks For <a target="_blank" rel="noopener" href="https://github.com/nanxiaobei/hugo-paper" taget="_blank">hugo-paper</a></span>
    <span style="margin-left: 10px;">&copy; 2016-2025 by Tit1e</span>
  </p>
</footer>
    </div>
    <script src="//unpkg.com/@highlightjs/cdn-assets@11.5.0/highlight.min.js"></script>
<script>
  hljs.initHighlightingOnLoad();
  var _hmt = _hmt || [];
    (function() {
    var hm = document.createElement("script");
    hm.src = "https://hm.baidu.com/hm.js?6349d3bc54baea0b04a65145c5e3b799";
    var s = document.getElementsByTagName("script")[0];
    s.parentNode.insertBefore(hm, s);
    })();
    const block = document.querySelectorAll('.post-content')[0]
    block.addEventListener('click', e => {
        const {nodeName, src} = e.target
        if(nodeName !== 'IMG') return
        document.body.classList.add('overflow-hidden')
        const div = document.createElement('div')
        div.id = 'global-cover'
        div.title = '点击关闭'
        const a = document.createElement('a')
        a.href = src
        a.target="_blank"
        a.title = '点击打开原图'
        const img = document.createElement('img')
        img.className = 'show-pic'
        img.src = src
        a.appendChild(img)
        div.appendChild(a)
        document.body.appendChild(div)
    })
    document.body.addEventListener('click', e => {
        if(e.target.id === 'global-cover'){
            document.body.classList.remove('overflow-hidden')
            document.body.removeChild(e.target)
        }
    })
</script>
<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-7M04VN3JZ4"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());

  gtag('config', 'G-7M04VN3JZ4');
</script>

<script src="/js/search.js"></script>


</body>
</html>